package com.ekingstar.lss.commons.supper.dao;

import java.io.Serializable;
import java.util.List;

import com.ekingstar.lss.commons.supper.utils.query.LssCondition;
import com.ekingstar.lss.commons.supper.utils.query.LssQuery;
import com.sun.xml.internal.stream.Entity;

/**
 * 对数据库进行操作
 * @author 童弘成
 *
 * @param <ENTITY> 结果集对象
 */
public interface DaoSupper<ENTITY> {
	/**
	 * 获取数据
	 * @param query 获取条件
	 * @return 结果集
	 */
	List<Entity> getList(LssQuery query);
	
	/**
	 * 增加数据
	 * @param entity 数据对象
	 * @return 影响数据量
	 */
	int insert(ENTITY entity);
	
	/**
	 * 更改数据
	 * @param entity 数据对象
	 * @param pk 主键值
	 * @return 影响数据量
	 */
	int update(ENTITY entity,Serializable pk);
	
	/**
	 * 批量更改数据
	 * @param entity 数据对象
	 * @param conditions 更改删选条件，如果为空则更改所有数据。
	 * @return 影响数据量
	 */
	int update(ENTITY entity,List<LssCondition> conditions);
	
	/**
	 * 保存数据，是insert与update另个方法的结合；
	 * 判断添加还是更改的方式为是否有主键值。
	 * @param entity 数据对象。
	 * @return 影响数据量
	 */
	int save(ENTITY entity);
	
	/**
	 * 删除数据，此为物理删除，如非物理删除，请使用update方式。
	 * @param entity 数据对象。
	 * @return 影响数据量。
	 */
	int delete(ENTITY entity);
	
	/**
	 * 删除数据，此为物理删除，如非物理删除，请使用update方式。
	 * @param targetName 目标名称，jdbc为表名，hibernate为类全限定名称。
	 * @param pk 主键值。
	 * @return 影响数据量。
	 */
	int delete(String targetName,Serializable pk);
	
	/**
	 * 删除数据，此为物理删除，如非物理删除，请使用update方式。
	 * @param conditions 筛选条件。
	 * @return 影响数据量。
	 */
	int delete(String targetName,List<LssCondition> conditions);
	
	/**
	 * 根据主键ID获得数据。
	 * @param id 主键
	 * @return 数据实体
	 */
	ENTITY getEntity(Serializable id);
	
	/**
	 * 根据唯一键获得数据。
	 * @param uk 唯一键值
	 * @return 数据实体
	 */
	ENTITY getEntityByUk(Serializable uk);
}
